遍历JObject中的Json数据(以百度云人脸识别api返回的JSON数据为例)

因为最近在玩树莓派3+windows10 IOT cort用到了百度云的人脸识别接口,官方很贴心的给出了C#版的SDK,但是它是基于. net Framework 编写的。然而我所学习的UWP应用是运行在 . net core 上的。 因此我不得不从api开始自力更生。虽然比直接使用SDK要麻烦,但是也因此收获了许多。期间,尤其是对接口返回的Json数据的解析让我苦恼了许久。现在我把过程写下,作为笔记,也希望可以帮到一部分跟我遭遇相似的小伙伴。
因此我就以百度云人脸识别接口返回的json数据来做例子来演示如何获取Json中的数据

人脸注册

当向人脸注册api提交注册信息后,api会视结果返回两类字符串——成功或者不成功。
解析该Json结果时,主要的问题是:你不确定注册是否会成功,因此在解析时也就不能确定究竟该解析哪一类。我所想到的最简单粗暴的方式是:一上来就尝试获取"error_code" 以及" error_msg"的值。如果没有获取到,则会出现异常,因此用try_catch包裹住,在try块里面写注册失败的处理方法,在catch块里面写上注册成功的相应处理方法即可。

// 注册成功
{
"log_id": 73473737,
}
// 注册发生错误
{
"error_code": 216616,
"log_id": 674786177,
"error_msg": "image exist"
* }

C#代码

                    JObject result ;
                    try
                    {
                        int errorCode = 0;
                        string errorMsg = "";
                        errorMsg = result["error_msg"].ToString();
                        errorCode = Convert.ToInt32(result["error_code"].ToString());
                        RegistDetailsBlock.Text = "失败!";
                        switch (errorCode)
                        {
                            case 216616: DetailsBlock.Text = "已经存在相同图片"; break;
                            case 216402:
                                {
                                    DetailsBlock.Text = "未检测到人脸";
                                };
                                break;
                            case 216100:
                                {
                                    DetailsBlock.Text = "用户名非法,请检查输入";
                                    UserNameBox.Text = "";
                                };break;
                            default: DetailsBlock.Text = errorMsg;
                                break;
                        }

                    }
                    catch (Exception)
                    {
                        RegistDetailsBlock.Text = "成功!";
                        DetailsBlock.Text = "已成功注册面部信息";
                    }
                    resultBlock.Text = result.ToString();

人脸识别

在该Json块中,"result_num"、"log_id" 均很容易获得其值(var value=jsonResult["result_num"]),但是"uid"以及"scores"都藏在result里面,不太容易搞。此时就要使用 JToken 了。定义一个JToken对象 users 然后获取"result" 节点。 users[0] 表示"result"数组的第一个元素。注意此 result 节点其实是一个只有一个元素的JSON数组。接着获取"scores" :users0, 但是仍需注意,此 scores 子节点依然是只有一个元素的JSON数组,因此要获取识别结果的得分需要这样写:

var socre=users[0]["scores"][0];
{
  "result": [
    {
      "uid": "cool",
      "scores": [
        97.806999206543
      ],
      "group_id": "Test_1",
      "user_info": "SB"
    }
  ],
  "result_num": 1,
  "log_id": 2437804895083015
}

C#代码

                    JObject jsonResult;
                    double scores = 0.01;
                    JToken users = jsonResult["result"];
                    scores = Convert.ToDouble(users[0]["scores"][0].ToString());
                    if (scores > 80.0)//说明该人脸的匹配度达标
                    {
                        string UserInfo;
                        UserInfo = users[0]["user_info"].ToString();
                        ComeInBlock.Text = "识别成功!";
                        DetailsBlock.Text = "用户为: "+UserInfo;
                    }
                    else
                    {
                        //do something
                    }

人脸删除

只就json 结果来看,人脸删除跟人脸注册的处理方法是一样的。因此只放代码喽。
只是在我写我的app的时候,我需要实现多选删除,因此也稍微有必要在这里讲一下

// 删除成功
{
"log_id": 73473737,
}
// 删除发生错误
{
"error_code": 216612,
"log_id": 1382953199,
"error_msg": "user not exist"
}

C#代码

            try
            {
                int num = WhiteListView.SelectedItems.Count;//获取所选择的ListViewItem对象的个数

                for (int i = 0; i < num; i++)//遍历所选择的ListViewItem对象
                {
                    //逐个删除
                    string UID = WhiteListView.SelectedItems[i].ToString();

                    await faceClient.FaceDelete(UID);
                }
                RefreshUserList.Visibility = Visibility.Collapsed;
                await UpdateWhitelistedVisitorsList();
                statusBlock.Text = "已成功删除:" + num.ToString() + " 位用户";
            }
            catch (Exception)
            {

                NetProblem();
            }

组内用户列表查询

由于要显示一个所有用户的列表,因此用到了组内用户列表查询API。要实现它,与上述的情况相比额外需要一个List<T> , 我用的是List<string>。依然用到了JToken 这点与“人脸识别” 节中用法一致

{
"log_id": 3314921889,
"result_num": 2,
"result": [
{
"uid": "uid1",
"user_info": "user info 1"
},
{
"uid": "uid2",
"user_info": "user info 2"
}
]
}

                JObject result = await faceClient.GetGroupUsers();

                int num = result["result_num"].Value<Int32>();//用户总数

                JToken users = result["result"];

                List<string> testlist = new List<string>();

                for (int i = 0; i < num; i++)
                {
                    testlist.Add(users[i]["uid"].ToString());//
                }

                statusBlock.Text = result.ToString();//

                WhiteListView.ItemsSource = testlist;

走一步看一步待续吧


且慢不听
2 声望1 粉丝